#ifndef PARTICLESYSTEM_H
#define PARTICLESYSTEM_H

#include <QObject>
#include <QtOpenGL>
#include <QtOpenGL/QGLFunctions>
#include <ctime>

#include "CommonTypes.h"

class ParticleSystem : public QObject
{
    Q_OBJECT
public:
    explicit ParticleSystem(QObject *parent = 0);
    void Render(QMatrix4x4 projection, QMatrix4x4 view);

    void BuildSystem();

    // Setters de propiedades
    void setName(QString input);
    void setTextureID(GLuint input);
    void setTextureURL(QString url);
    void setSourcePosition (float x, float y, float z);
    void setSourceVar (float x, float y, float z);
    void setStepSize(float input);
    void setStepVar(float x);
    void setStartColor(float r, float g, float b, float a);
    void setStartColorVar(float x, float y, float z);
    void setEndColor(float r, float g, float b, float a);
    void setEndColorVar(float x, float y, float z);
    void setDir(float x, float y, float z);
    void setDirVar(float x, float y, float z);
    void setSize(float x, float y, float z);
    void setSizeVar(float x, float y, float z);
    void setTimeToLive(int input);
    void setTimeToLiveVar(int input);
    void setAmount(int input);
    void setSrcBlending(short int input);
    void setDstBlending(short int input);
    void setBlending(short int src, short int dst, short int funct, float ref);
    void setAlphaFunction(short int input);
    void setAlphaReference(float input);

    // Getters de propiedades
    QString getName();
    GLuint getTextureID();
    QString getTextureURL();
    float* getSourcePosition();
    float* getSourceVar();
    float getStepSize();
    float getStepVar();
    float* getStartColor();
    float* getStartColorVar();
    float* getEndColor();
    float* getEndColorVar();
    float* getDir();
    float* getDirVar();
    float* getSize();
    float* getSizeVar();
    int getTimeToLive();
    int getTimeToLiveVar();
    int getAmount();
    short int getSrcBlending();
    short int getDstBlending();
    short int getAlphaFunction();
    float getAlphaReference();

    bool HasTexture();

    // Utilidades

private:
    void timerEvent(QTimerEvent* e);
    void DrawParticles();
    void SetBillBoardView(QMatrix4x4 projection, QMatrix4x4 view);

    float randomFloat();
    int randomInt(int max);
    float randomSign();

    void GenerateColorStep();

    float Steps; // Permite saber cuantas veces debe actualizarse el sistema

    // Propiedades del Sistema de Particulas
    QString name; 
    float StepSize; // Velocidad de animacion
    float StepVar;// Varianza de velocidad
    vec3 SourcePosition; // Origen
    vec3 SourceVar; // Varianza en el origen
    vec4 StartColor; // Color inicial
    vec3 StartColorVar; // Varianza en el color inicial
    vec4 EndColor; // Color final
    vec3 EndColorVar; // Varianza en el color final
    vec4 ColorStep; // Para interpolar entre ambos colores
    vec3 Direction; // Direccion
    vec3 DirectionVar; // Varianza en la direccion
    vec3 Size; // Tamaño de la particula div 2
    vec3 SizeVar; // Varianza en el tamaño
    int TimeToLive; // Tiempo de vida de la particula
    int TimeToLiveVar; // Varianza en el ttl de la particula
    int Amount;
    int ElapsedTime;
    int TimerID;
    GLenum SrcBlending;
    GLenum DstBlending;
    GLenum AlphaFunction;
    float AlphaReference;
    GLuint TextureID;
    QString TextureURL;
    bool HASTEXTURE;

    float ZOffset;
    float ZUnit;

    QVector <particle> Particles;

signals:

public slots:

};

#endif // PARTICLESYSTEM_H
